//
//  UITableView+HHPTableViewManager.h
//  HHPTableViewManager
//
//  Created by 韩红坡 on 2017/3/8.
//  Copyright © 2017年 韩红坡. All rights reserved.
//

#import <UIKit/UIKit.h>

#define HHPTableViewManagerException @"HHPTableViewManagerException"

@class HHPTableViewSectionModel;
@class HHPTableViewCellModel;

@interface UITableView (HHPTableViewManager)

@property (nonatomic, strong, readonly) HHPTableViewSectionModel *hhp_defaultSection; // 第一个section，没有会自动创建
@property (nonatomic, strong, readonly) HHPTableViewCellModel *hhp_selectedCellModel; // 选中的cell
@property (nonatomic, copy) void (^hhp_didSelectCellBlock)(HHPTableViewCellModel *cellModel, BOOL selectionIsChanged); // 选中cell的回调，selectionIsChanged表示是否为第一次选中。如果cell的种类比较多，不推荐使用。建议使用HHPTableViewCellModel的didSelectCellBlock

/**
 重新加载数据源，会调用reloadData方法
 用于第一次初始化，或者全部刷新数据
 不在此方法的block中操作数据，会发生实时的列表操作，如insertRowsAtIndexPaths:
 
 @param block 刷新block
 */
- (void)hhp_reloadDataWithBlock:(void (^)(void))block;
/**
 清空列表所有的数据
 */
- (void)hhp_removeAllSections;

/**
 检查section是否已经加入tableview
 
 @param sectionModel section数据模型
 
 @return 是否加入
 */
- (BOOL)hhp_sectionInTableView:(HHPTableViewSectionModel *)sectionModel;


/**
 检查cell是否已经加入tableview
 
 @param cellModel cell数据模型
 
 @return 是否加入
 */
- (BOOL)hhp_cellInTableView:(HHPTableViewCellModel *)cellModel;


/**
 获取cell对应的indexPath
 
 @param cellModel cell数据模型
 
 @return NSIndexPath
 */
- (NSIndexPath *)hhp_indexPathForCell:(HHPTableViewCellModel *)cellModel;

/**
 添加section
 
 @param sectionModel section数据模型
 */
- (void)hhp_addSection:(HHPTableViewSectionModel *)sectionModel;

/**
 在一个section后插入section
 
 @param sectionModel        要插入的section数据模型
 @param anotherSectionModel 目标section数据模型
 */
- (void)hhp_insertSection:(HHPTableViewSectionModel *)sectionModel
             afterSection:(HHPTableViewSectionModel *)anotherSectionModel;

/**
 在一个section前插入section
 
 @param sectionModel        要插入的section数据模型
 @param anotherSectionModel 目标section数据模型
 */
- (void)hhp_insertSection:(HHPTableViewSectionModel *)sectionModel
            beforeSection:(HHPTableViewSectionModel *)anotherSectionModel;

/**
 重新加载section
 
 @param sectionModel section数据模型
 */
- (void)hhp_reloadSection:(HHPTableViewSectionModel *)sectionModel;

/**
 删除section
 
 @param sectionModel section数据模型
 */
- (void)hhp_deleteSection:(HHPTableViewSectionModel *)sectionModel;

/**
 在第一个section添加一个cell。如果没有第一个section，则自动创建
 
 @param cellModel cell数据模型
 */
- (void)hhp_addCell:(HHPTableViewCellModel *)cellModel;

/**
 在第一个section添加多个cell。如果没有第一个section，则自动创建
 
 @param cellModels cell数据模型
 */
- (void)hhp_addCells:(NSArray<HHPTableViewCellModel *> *)cellModels;

/**
 在第一个section的cell后面插入cell。如果没有第一个section，则自动创建
 
 @param cellModel        cell数据模型
 @param anotherCellModel 目标cell数据模型
 */
- (void)hhp_insertCell:(HHPTableViewCellModel *)cellModel
             afterCell:(HHPTableViewCellModel *)anotherCellModel;

/**
 在第一个section的cell后面批量插入cell。如果没有第一个section，则自动创建
 
 @param cellModels       cell数据模型数组
 @param anotherCellModel 目标cell数据模型
 */
- (void)hhp_insertCells:(NSArray<HHPTableViewCellModel *> *)cellModels
              afterCell:(HHPTableViewCellModel *)anotherCellModel;

/**
 在第一个section的cell前面插入cell。如果没有第一个section，则自动创建
 
 @param cellModel        cell数据模型
 @param anotherCellModel 目标cell数据模型
 */
- (void)hhp_insertCell:(HHPTableViewCellModel *)cellModel
            beforeCell:(HHPTableViewCellModel *)anotherCellModel;

/**
 在第一个section的cell前面批量插入cell。如果没有第一个section，则自动创建
 
 @param cellModels       cell数据模型数组
 @param anotherCellModel 目标cell数据模型
 */

- (void)hhp_insertCells:(NSArray<HHPTableViewCellModel *> *)cellModels
             beforeCell:(HHPTableViewCellModel *)anotherCellModel;

/**
 添加一个cell
 
 @param cellModel    cell数据模型
 @param sectionModel 目标section数据模型
 */
- (void)hhp_addCell:(HHPTableViewCellModel *)cellModel
          inSection:(HHPTableViewSectionModel *)sectionModel;

/**
 添加多个cell
 
 @param cellModels   cell数据模型数组
 @param sectionModel 目标section数据模型
 */
- (void)hhp_addCells:(NSArray<HHPTableViewCellModel *> *)cellModels
           inSection:(HHPTableViewSectionModel *)sectionModel;

/**
 在cell后面插入cell
 
 @param cellModel        cell数据模型
 @param anotherCellModel 目标cell数据模型
 @param sectionModel     目标section数据模型
 */
- (void)hhp_insertCell:(HHPTableViewCellModel *)cellModel
             afterCell:(HHPTableViewCellModel *)anotherCellModel
             inSection:(HHPTableViewSectionModel *)sectionModel;

/**
 在cell后面批量插入cell
 
 @param cellModels       cell数据模型数组
 @param anotherCellModel 目标cell数据模型
 @param sectionModel     目标section数据模型
 */
- (void)hhp_insertCells:(NSArray<HHPTableViewCellModel *> *)cellModels
              afterCell:(HHPTableViewCellModel *)anotherCellModel
              inSection:(HHPTableViewSectionModel *)sectionModel;

/**
 在cell前面插入cell
 
 @param cellModel        cell数据模型
 @param anotherCellModel 目标cell数据模型
 @param sectionModel     目标section数据模型
 */
- (void)hhp_insertCell:(HHPTableViewCellModel *)cellModel
            beforeCell:(HHPTableViewCellModel *)anotherCellModel
             inSection:(HHPTableViewSectionModel *)sectionModel;

/**
 在cell前面批量插入cell
 
 @param cellModels       cell数据模型数组
 @param anotherCellModel 目标cell数据模型
 @param sectionModel     目标section数据模型
 */

- (void)hhp_insertCells:(NSArray<HHPTableViewCellModel *> *)cellModels
             beforeCell:(HHPTableViewCellModel *)anotherCellModel
              inSection:(HHPTableViewSectionModel *)sectionModel;

/**
 重新加载cell
 
 @param cellModel cell数据模型
 */
- (void)hhp_reloadCell:(HHPTableViewCellModel *)cellModel;

/**
 批量重新加载cell
 
 @param cellModels cell数据模型数组
 */
- (void)hhp_reloadCells:(NSArray<HHPTableViewCellModel *> *)cellModels;

/**
 删除cell
 
 @param cellModel cell数据模型
 */
- (void)hhp_deleteCell:(HHPTableViewCellModel *)cellModel;

/**
 批量删除cell
 
 @param cellModels cell数据模型数组
 */
- (void)hhp_deleteCells:(NSArray<HHPTableViewCellModel *> *)cellModels;

/**
 选择cell
 
 @param cellModel cell数据模型
 */
- (void)hhp_selectCell:(HHPTableViewCellModel *)cellModel;

/**
 取消选择cell
 
 @param cellModel cell数据模型
 */
- (void)hhp_deselectCell:(HHPTableViewCellModel *)cellModel;

@end
